package cn.szv5.leetcode;

/**
 * 应用模块名称<p>
 * 代码描述<p>
 * Copyright: Copyright (C) 2022 , Inc. All rights reserved. <p>
 * Company: 阿飞工作室<p>
 *
 * @author Carl
 * @since 2022/3/24 23:55
 */
public class RemoveOuterParentheses1021 {

    public static void main(String[] args) {
        String[] strs = {"(()())(())", "(()())(())(()(()))", "()()"};
        RemoveOuterParentheses1021.Solution solution = new RemoveOuterParentheses1021().new Solution();

        for (int i = 0; i < strs.length; i++) {
            System.out.println(solution.removeOuterParentheses(strs[i]));
        }
    }

    class Solution {
        /**
         * 最优解：代码优化：
         * 1. 直接用数组取代栈
         *    创建数组、栈顶索引，使用数组操作入栈和出栈
         * 2. 将原字符串转为数组进行遍历
         * 3. 去掉截取子串操作，将原语字符直接拼接
         *    读取到左括号：此前有数据，当前必属原语
         *    读取到右括号：匹配后不为0，当前必属原语
         *
         * @param s
         * @return
         */
        public String removeOuterParentheses(String s) {
            StringBuilder result = new StringBuilder();
            // 1.定义计数器count,统计左括号出现的次数
            int count = 0;
            int len = s.length();
            // 2.将原字符串转为数组进行遍历
            char[] chars = s.toCharArray();
            char c = '\u0000';
            // 3.遍历字符串，根据情况进行入栈/出栈操作
            for (int i = 0; i < len; i++) {
                c = chars[i];
                if ('(' == c) {
                    // 此前有数据，当前必属原语
                    if (count > 0) {
                        result.append(c);
                    }
                    count++;
                } else {
                    count--;
                    if (count > 0) {
                        // 右括号之后不为0，count自减后仍有数据，则当前必然是原语的一部分
                        result.append(c);
                    }
                }
            }
            return result.toString();
        }

    }
}
